#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define STACK_INCREATMENT 10
#define MAX_SIZE 6
typedef int Status;
typedef int SElemType;

typedef struct cur_queue
{
    int front; // 头数据位置
    int rear;  // 尾数据位置
    SElemType *data;
} cur_queue;

Status init_cur_queue(cur_queue *queue)
{
    queue->data = (SElemType *)malloc(sizeof(SElemType) * MAX_SIZE); // 对数组分配空间
    if (!queue->data)
    {
        return ERROR;
    }
    queue->front = 0; // 初始化头指向位置
    queue->rear = 0;  // 初始化尾指向位置
    return OK;
}

Status EnQueue(cur_queue *queue, SElemType data)
{
    if ((queue->rear + 1) % MAX_SIZE == queue->front) // 判断是不是满了(留一个空间不用)
    {
        return ERROR;
    }
    queue->data[queue->rear] = data;            // 尾部插入
    queue->rear = (queue->rear + 1) % MAX_SIZE; // 修改为尾指向位置
    return OK;
}

int Queue_length(cur_queue *queue)
{
    int len = 0;
    len = (queue->rear - queue->front) % MAX_SIZE;
    return len;
}

Status DeQueue(cur_queue *queue, SElemType *e)
{
    *e = -1; // 如果队列为空就返回一个*e=-1;
    if (queue->rear == queue->front)
    {
        return ERROR;
    }
    *e = queue->data[queue->front]; // 取得头部数据
    queue->front = (queue->front + 1) % MAX_SIZE;
    return OK;
}

int main()
{
    // 定义一个循环队列
    cur_queue *queue = (cur_queue *)malloc(sizeof(cur_queue));

    // 初始化队列
    init_cur_queue(queue);

    // 插入数据EnQueue
    for (int i = 1; i < 10; i++)
    {
        int status = EnQueue(queue, i);
        printf("status: %d\tdata:%d\n", status, i);
    }

    // 返回长度Queue_length
    int lenght = Queue_length(queue);
    printf("------------------表内含有%d个元素------------------\n", lenght);

    // 删除数据DeQueue
    SElemType *e = (SElemType *)malloc(sizeof(SElemType)); // 使用e取得返回的删除的数据
    for (int i = 0; i < 10; i++)
    {
        int status = DeQueue(queue, e);
        printf("删除操作状态:%d\t所删除元素:%d\n", status, *e);
    }

    lenght = Queue_length(queue);
    printf("------------------表内含有%d个元素------------------\n", lenght);

    // 测试循环
    printf("------------------------------测试是否循环------------------------------\n");
    for (int i = 1; i < 6; i++)
    {
        int status = EnQueue(queue, i);
        printf("status: %d\tdata:%d\n", status, i);
    }

    int status = DeQueue(queue, e);
    printf("删除操作状态:%d\t所删除元素:%d\n", status, *e);

    status = DeQueue(queue, e);
    printf("删除操作状态:%d\t所删除元素:%d\n", status, *e);

    status = EnQueue(queue, 199);
    printf("插入操作状态:%d\tdata:199\n", status);

    status = DeQueue(queue, e);
    printf("删除操作状态:%d\t所删除元素:%d\n", status, *e);

    status = EnQueue(queue, 200);
    printf("插入操作状态:%d\tdata:200\n", status);

    status = EnQueue(queue, 201);
    printf("插入操作状态:%d\tdata:201\n", status);

    status = EnQueue(queue, 202);
    printf("插入操作状态:%d\tdata:202\n", status);

    for (int i = 0; i < 10; i++)
    {
        int status = DeQueue(queue, e);
        printf("删除操作状态:%d\t所删除元素:%d\n", status, *e);
    }

    return 0;
}